#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>

void hander_usr1(int sid)
{
    printf("子进程：接收到信号 %d \n", sid);
    while(1)
    {
        printf("子进程开始执行。。\n");
        sleep(1);
    }
    // 子进程也有自己的命名空间
    // kill(getppid(), SIGUSR1);
}

int main()
{
    pid_t pid = fork();
    if(pid < 0)
    {
        perror("创建进程失败！\n");
        exit(1);
    }
    if(pid == 0)
    {
        printf("子进程启动！\n");
        printf("子注册接收函数\n");
        // 注册信号接收
        // 信号名 信号处理函数
        signal(SIGUSR1, hander_usr1);
        // 暂停等待信号到达，
        // 进程挂起，等待信号当进程接收到信号并且该信号的处理函数返回后，
        // pause() 也会返回，并且进程将继续执行 pause()之后的代码。
        pause();
        // // 不加循环子进程，会结束
        // while(1)
        // {
        //     sleep(1);
        // }
    }
    else
    {
        printf("主进程启动\n");
        // 等待子进程启动，子进程启动才能收到信号
        // 异步操作：回调函数 callback , 钩子函数 hook
        // signal(SIGUSR1, todo);
        sleep(2);
        //给子进程发送一个信号,让子进程执行信号处理函数
        kill(pid, SIGUSR1);
        printf("主进程：发送 SIGUSR1 信号\n");
        sleep(5);
        //给子进程发送信号，让子进程结束
        kill(pid, SIGTERM);
        printf("主进程发送信号：STGTERM\n");
        wait(NULL);
        
    }
}